package utils

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"math/rand"
	"net/http"
	"net/url"

	"time"
)

type Proxy struct {
	Ip string `json:"ip"`
	Id string `json:"id"`
}

func GetProxy() (proxy Proxy, err error) {
	url := "http://ip.wenongtang.com/getip/"

	resp, err := http.Get(url)
	if err != nil {
		fmt.Println(err)

		return

	}
	defer resp.Body.Close()
	input, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err)
	}
	//fmt.Println(string(input))
	json.Unmarshal([]byte(input), &proxy)

	return
}

// http get by proxy
func GetByProxy(url_addr string) (*http.Response, int) {
	var user_agent = []string{
		"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
		"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
		"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
		"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
		"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
		"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
		"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
		"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
		"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
		"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
		"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
		"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
		"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
		"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
		"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
		"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
		"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
		"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
	}

	count := 0
	var resp *http.Response

	for {
		count++
		if count > 5 {
			return resp, count
		}
		ip, _ := GetProxy()
		request, _ := http.NewRequest("GET", url_addr, nil)
		proxy, _ := url.Parse("https://" + ip.Ip)
		request.Header.Add("User-Agent", user_agent[rand.Intn(17)])

		client := &http.Client{
			Transport: &http.Transport{
				Proxy: http.ProxyURL(proxy),
			},
			Timeout: time.Duration(time.Second * 30),
		}

		resp, _ = client.Do(request)

		//		fmt.Println(resp)
		//		code := resp.StatusCode
		//		if code == 200 {
		//			return resp
		//		} else {
		//			http.Get("http://ip.wenongtang.com/setip/" + ip.Id)
		//		}
		//		time.Sleep(time.Second * 2)

		if resp != nil {
			//fmt.Println(resp.StatusCode)
			if resp.StatusCode == 200 {
				return resp, count
			} else {
				http.Get("http://ip.wenongtang.com/setip/" + ip.Id)
			}
			time.Sleep(time.Second * 2)
		} else {
			http.Get("http://ip.wenongtang.com/setip/" + ip.Id)
			time.Sleep(time.Second * 2)
		}
	}

}
